// 登录与注册功能
const db = require('../db/index');
const bcrypt = require('bcryptjs');
const jwt = require('jsonwebtoken');
const jwtconfig = require('../jwt_config/index');

// 注册，暴露接口给login(router)
exports.register = (req,res) => {
    // req是前端传过来的内容， res是返回给前端的数据
    const reginfo = req.body
    // 1. 是否为空
    if(!reginfo.account || !reginfo.password) {
        return res.send({
            status: 1,
            message: "账号或密码不能为空！"
        })
    }
    // 2. 使用mysql的select判断前端传递过来的账号是否在数据表
    // ? 是一个占位符，在实际执行查询时，会将具体的值替换到这个占位符的位置
    const sql = "select * from users where account = ?" 
    db.query(sql, reginfo.account, (err, results) => {  // 执行查询语句
        if(results.length > 0){  // 说明在account列找到了和reginfo.account一样的值
            return res.send({
                status: 1,
                message: "账号已存在！"
            })
        }
        // 3. 下面表示未注册，对账号密码进行加密  bcrypt.hashSync(加密字段，加密后长度)
        reginfo.password = bcrypt.hashSync(reginfo.password, 10)
        // 4. 把账号密码插入到users表
        const sqlInsert = "insert into users set ?"
        const identity = "用户" // 注册身份
        const create_time = new Date()
        db.query(sqlInsert, {
            account: reginfo.account,
            password: reginfo.password,
            identity,
            create_time,
            status: 0  // 0表示未冻结
        }, (err, results)=>{
            // 插入失败，表示不影响行数，即不为1  affectedRows影响的行数
            if(results.affectedRows !== 1){
                return res.send({
                    status: 1,
                    message: "注册账号失败！（插入表失败）"
                })
            }
            // 插入成功
            res.send({
                status: 0,
                message: "注册账号成功！"
            })
        })
    })
}

// 登录
exports.login = (req,res) => {
    const loginfo = req.body
    // 1.看下数据库里面有没有账号
    const sql = "select * from users where account = ?"
    db.query(sql,loginfo.account, (err,results)=>{
        if(err) return res.cc(err)  // 一般是数据库断开了
        if(results.length !== 1) return res.cc("登录失败，未找到该账号！")
        // 2. 对前端传递过来的密码进行解密  bcrypt.compareSync(输入的密码, 数据库里面的密码)比较
        // 输入的明文密码会在代码中使用 bcrypt 库的方法进行加密处理，然后与数据库中存储的加密后的哈希值进行比较
        const compareResult = bcrypt.compareSync(loginfo.password, results[0].password)
        if(!compareResult){
            return res.cc("登录失败，密码错误！")
        }
        // 3. 判断账号有无冻结
        if(results[0].status==1){
            return res.cc("登录失败，账号已冻结！")
        }
        // 4. 生成返回给前端的token
        // 需要剔除加密后的密码(安全考虑)、头像、创建时间、更新时间，token 通常用于在客户端和服务器之间传递必要的用户标识和授权信息
        const user = {  
            ...results[0],
            password: '',
            imageUrl: '',
            create_time: '',
            update_time: '',
        }
        // 设置token有效时长,24小时
        const tokenStr = jwt.sign(user, jwtconfig.jwtSecretKey, {
            expiresIn: '24h' 
        })
        res.send({
            results: results[0],  // 返回账号的所有信息
            status: 0,
            message: "登录成功！",
            token: 'Bearer ' + tokenStr  // 加'Bearer'是规定
        })
    })
}

// 超级管理员路由
const superAdminRouter = [ 
  {
    name: 'setting',
    path: '/setting',
    component: "setting/index",  // 系统设置
  }, 
  {
    name: 'overview',
    path: '/overview',
    component: "overview/index",  // 系统概览
  },
  {
    name: 'product_manage',
    path: '/product_manage',
    component: "user_manage/product_manage/index",  // 用户管理/管理员管理/产品管理员
  },
  {
    name: 'message_manage',
    path: '/message_manage',
    component: "user_manage/message_manage/index",  //  用户管理/管理员管理/消息管理员
  },
  {
    name: 'users_manage',
    path: '/users_manage',
    component: "user_manage/users_manage/index",  // 用户管理/管理员管理/用户管理员
  },
  {
    name: 'user_list',
    path: '/user_list',
    component: "user_manage/user_list/index",  // 用户管理/员工管理/用户列表
  },
  {
    name: 'product_manage_list',
    path: '/product_manage_list',
    component: "product/product_manage_list/index",  // 产品列表，产品管理
  },
  {
    name: 'out_product_manage_list',
    path: '/out_product_manage_list',
    component: "product/out_product_manage_list/index",  // 出库列表，产品管理
  },
  {
    name: 'message_list',
    path: '/message_list',
    component: "message/message_list/index", // 消息列表
  },
  {
    name: 'recycle',
    path: '/recycle',
    component: "message/recycle/index", // 消息列表 回收站
  },  
]

// 用户管理员路由
const userAdminRouter = [ 
  {
    name: 'setting',
    path: '/setting',
    component: "setting/index",  // 系统设置
  },
  {
    name: 'product_manage',
    path: '/product_manage',
    component: "user_manage/product_manage/index",  // 用户管理/管理员管理/产品管理员
  },
  {
    name: 'message_manage',
    path: '/message_manage',
    component: "user_manage/message_manage/index",  //  用户管理/管理员管理/消息管理员
  },
  {
    name: 'users_manage',
    path: '/users_manage',
    component: "user_manage/users_manage/index",  // 用户管理/管理员管理/用户管理员
  },
  {
    name: 'user_list',
    path: '/user_list',
    component: "user_manage/user_list/index",  // 用户管理/员工管理/用户列表
  },
]

// 产品管理员路由
const productAdminRouter = [ 
  {
    name: 'setting',
    path: '/setting',
    component: "setting/index",  // 系统设置
  }, 
  {
    name: 'product_manage_list',
    path: '/product_manage_list',
    component: "product/product_manage_list/index",  // 产品列表，产品管理
  },
  {
    name: 'out_product_manage_list',
    path: '/out_product_manage_list',
    component: "product/out_product_manage_list/index",  // 出库列表，产品管理
  }, 
]

// 消息管理员路由
const messageAdminRouter =  [ 
  {
    name: 'setting',
    path: '/setting',
    component: "setting/index",  // 系统设置
  }, 
  {
    name: 'message_list',
    path: '/message_list',
    component: "message/message_list/index", // 消息列表
  },
  {
    name: 'recycle',
    path: '/recycle',
    component: "message/recycle/index", // 消息列表 回收站
  }, 
]

// 用户路由 const userRouter = []

// 返回路由列表
exports.returnMenuList = (req, res) => {
  const sql = "select identity from users where id = ?"
  db.query(sql, req.body.id, (err, results)=>{
    if (err) return res.cc(err) 
    let menu = []
    if(results[0].identity == "超级管理员"){
      menu = superAdminRouter
    }
    if(results[0].identity == "用户管理员"){
      menu = userAdminRouter
    }
    if(results[0].identity == "产品管理员"){
      menu = productAdminRouter
    }
    if(results[0].identity == "消息管理员"){
      menu = messageAdminRouter
    }
    if(results[0].identity == "用户"){
      menu = []
    }
    res.send(menu)
  })
}



